package com.flst.persistance.jdbcDao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.flst.model.Categorie;
import com.flst.model.Produit;
import com.flst.persistance.ICategorieDao;
/**
 * 
 * Cette classe contient l'implementation JDBC de l'interface ICategorieDao
 *
 */
public class CategorieDaoJdbc implements ICategorieDao{
	private static final String QUERY_GET_ALL_PRODUCTS="SELECT * FROM PRODUIT WHERE CATEGORIE=?";
	private static final String QUERY_GET_INFO_CATEGORIE="SELECT * FROM CATEGORIE where ID=?";
	private static final String QUERY_UPDATE_VISITE_CATEGORIE="update CATEGORIE set visite = (select visite from CATEGORIE where id =?)+1 where id =?";
	private static final String QUERY_GET_CATEGORIES_VIEWS="SELECT * FROM CATEGORIE ORDER BY VISITE DESC LIMIT 0,3";

	/**
	 * r&eacute;cup&egrave;re la liste de produit d'une cat&eacute;gorie <br>Il y a deux requ&egrave;tes effectu&eacute;es :
	 * <ul>
	 * <li>QUERY_UPDATE_VISITE_CATEGORIE : incr&eacute;mente en BDD la visite de la categorie(avec en param&egrave;tre preparedstatement l'id de la cat&eacute;gorie)</li>
	 * <li>QUERY_GET_ALL_PRODUCTS : r&eacute;cup&egrave;re les produits de la cat&eacute;gorie (avec en param&egrave;tre preparedStatement l'id de la cat&eacute;gorie)</li>
	 * </ul> 
	 * @param idCat
	 * 		ID d'une categorie
	 * @return La liste des produits de la cat&eacute;gorie
	 */
	@Override
	public List<Produit> getAllProduits(int idCat) {
		Connection con=null;
		try {
			con = JdbcUtils.getInstance().getConnection();
		} catch (JdbcException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		List<Produit> liste=new ArrayList<Produit>();

		PreparedStatement vPs=null;
		try {
			vPs = con.prepareStatement(QUERY_UPDATE_VISITE_CATEGORIE) ;
			vPs.setInt(1, idCat);
			vPs.setInt(2, idCat);
			vPs.execute();

			vPs = con.prepareStatement(QUERY_GET_ALL_PRODUCTS) ;
			vPs.setInt(1, idCat);
			vPs.execute();
			ResultSet vRs=vPs.getResultSet();

			while(vRs.next()){
				Produit produit=new Produit();
				produit.setId(vRs.getInt("ID"));
				produit.setDescription(vRs.getString("DESCRIPTION"));
				produit.setKeyword(vRs.getString("MOTCLES"));
				produit.setPopularite(vRs.getInt("POPULARITE"));
				produit.setPrix(vRs.getFloat("PRIX"));
				produit.setTitre(vRs.getString("TITRE"));
				produit.setUrlPhoto(vRs.getString("URLPHOTO"));
				produit.setVisite(vRs.getInt("VISITE"));
				liste.add(produit);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return liste;
	}

	/**
	 * R&eacute;cup&egrave;re les informations d'une cat&eacute;gorie - une requ&egrave;te : QUERY_GET_INFO_CATEGORIE avec en param&egrave;tre l'ID de la cat&eacute;gorie
	 * @param idCat
	 * 		ID de la cat&eacute;gorie
	 * @return Le mod&egrave;le de la cat&eacute;gorie
	 */
	@Override
	public Categorie getCategorie(int idCat) {
		Connection con=null;
		try {
			con = JdbcUtils.getInstance().getConnection();
		} catch (JdbcException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Categorie categorie=new Categorie();

		PreparedStatement vPs=null;
		try {
			vPs = con.prepareStatement(QUERY_GET_INFO_CATEGORIE) ;
			vPs.setInt(1, idCat);
			vPs.execute();
			ResultSet vRs=vPs.getResultSet();
			vRs.next();
			categorie.setDescription(vRs.getString("DESCRIPTION"));
			categorie.setKeywords(vRs.getString("MOTCLES"));
			categorie.setTitre(vRs.getString("TITRE"));
			categorie.setProduits(getAllProduits(idCat));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return categorie;
	}
	/**
	 * R&eacute;cup&egrave;re une liste de cat&eacute;gories gr&agrave;ce &agrave; la requ&egrave;te QUERY_GET_CATEGORIES_VIEWS
	 * @return La liste des trois cat&eacute;gories les plus vues
	 */
	@Override
	public List<Categorie> getCategoriesVues() {
		Connection con=null;
		try {
			con = JdbcUtils.getInstance().getConnection();
		} catch (JdbcException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		List<Categorie> liste=new ArrayList<Categorie>();

		Statement s;
		try {
			s = con.createStatement();
			s.execute(QUERY_GET_CATEGORIES_VIEWS);
			ResultSet rs = s.getResultSet();
			while(rs.next()){
				Categorie categorie=new Categorie();
				categorie.setId(rs.getLong("ID"));
				categorie.setTitre(rs.getString("TITRE"));
				liste.add(categorie);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return liste;
	}
}




